package cn.yuan.basic.service.impl;

import cn.yuan.basic.Exception.BusinessException;
import cn.yuan.basic.service.IVerifyCodeService;
import cn.yuan.basic.util.StrUtils;
import cn.yuan.basic.constant.UserConstants;
import cn.yuan.user.domain.User;
import cn.yuan.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    @Qualifier("redisTemplate")//如果不写这个注解下面只能用redisTemplate否则会报错
    private RedisTemplate redisTemplate;

    @Override
    public void smsCode(Map<String,String> params) {
         //1.校验
        //1.1非空校验
//        if(StringUtils.hasLength(phone)){
//            throw new BusinessException("请输入手机号！");
//        }
//        //1.2是否被注册
//        User user =  userMapper.loadByPhone(phone);
//        if(user!=null){
//            throw new BusinessException("该号码已注册！");
//        }
//        //2.判断原来验证码的是否有效
//        Object codeObj = redisTemplate.opsForValue().get(UserConstants.REGISTER_CODE_PREFIX + phone);
//        //2.1如果有效
//        String code =null;
//        if(codeObj!=null) {
//            String codeStr = (String) codeObj;
//            //2.1.1判断是否已过重发时间
//            //2.1.1.1如过没有过提示错误
//            String time = codeStr.split(":")[1];
//            long intervalTime = System.currentTimeMillis() - Long.valueOf(time);
//            if (intervalTime <= 60 * 1000) {
//                throw new BusinessException("请勿重复发送短信验证码！");
//            }
//            //2.1.1.2如果过了就用原来的验证码
//            code = codeStr.split(":")[0];
//        }else {
//            //2.2如果过了
//            //2.2.1重新生成验证码
//            code = StrUtils.getComplexRandomString(6);
//        }
//        //3.保存验证码到redis
//        redisTemplate.opsForValue().set(UserConstants.REGISTER_CODE_PREFIX+phone, code+":"+System.currentTimeMillis(), 3, TimeUnit.MINUTES);
//        //4.调用短信接口发送短信
//        SmsUtil.sendSms(phone,"您的验证码为："+code+",请在3分钟之内使用！");
        System.out.println("===================================================================================");
        //1.校验
        //1.1非空校验
//       if(!StringUtils.hasLength(phone)){
//           throw new BusinessException("请输入手机号码！！！");
//       }
//        //1.2是否被注册
//        User user = userMapper.loadByPhone(phone);
//       if(user!=null){
//           throw new BusinessException("请不要重复注册！！！");
//       }
//        //2.判断原来验证码的是否有效(通过调用RedisTemplate中opsForValue()方法再调用get方法获取验证码)
//        Object codeObj = redisTemplate.opsForValue().get(UserConstants.REGISTER_CODE_PREFIX + phone);
//        //2.1如果有效
//        String code = null;
//        if(codeObj!=null){
//            String codeStr = (String) codeObj;
//            String time = codeStr.split(":")[1];
//            Long timeLong = Long.valueOf(time);
//            //2.1.1判断是否已过重发时间
//            //2.1.1.1如过没有过提示错误
//            if(System.currentTimeMillis()-timeLong<=60*1000){
//                throw new BusinessException("请不要重复发送！！！");
//            }
//            //2.1.1.2如果没过就用原来的验证码
//            code = codeStr.split(":")[0];
//
//        }else {
//            //2.2如果过了
//            //2.2.1重新生成验证码
//            code = StrUtils.getComplexRandomString(4);
//        }
//        //3.保存验证码到redis
//        redisTemplate.opsForValue().set(UserConstants.REGISTER_CODE_PREFIX+phone, System.currentTimeMillis(), 3, TimeUnit.MINUTES);
//        //4.调用短信接口发送短信
//        SmsUtil.sendSms(phone,"您的验证码为："+code+",请在3分钟之内使用！");
        System.out.println("===================================================================================");
        //1.校验
        //1.1非空校验
//        if(StringUtils.hasLength(phone)){
//            throw new BusinessException("请输入电话号码");
//        }
//        //1.2是否被注册
//        User user = userMapper.loadByPhone(phone);
//        //2.判断原来验证码的是否有效(通过调用RedisTemplate中opsForValue()方法再调用get方法获取验证码)
//        Object codeObj = redisTemplate.opsForValue().get(UserConstants.REGISTER_CODE_PREFIX + phone);
//        //2.1如果有效
//        String code = null;
//        if(codeObj!=null){
//            String codeStr = (String) codeObj;
//            String time = codeStr.split(":")[1];
//            Long timeLong = Long.valueOf(time);//将其他类型转换为Long类型的数据
//            //2.1.1判断是否已过重发时间
//            if(System.currentTimeMillis()-timeLong<=60*1000){
//                //2.1.1.1如过没有过提示错误
//                throw new BusinessException("请不要重复发送！！！");
//
//            }
//            //2.1.1.2如果没过就用原来的验证码
//            code = codeStr.split(":")[0];
//        }else {
//            //2.2如果过了
//            //2.2.1重新生成验证码
//            code = StrUtils.getComplexRandomString(4);
//        }
//        //3.保存验证码到redis
//        redisTemplate.opsForValue().set(UserConstants.REGISTER_CODE_PREFIX+phone, System.currentTimeMillis(), 3, TimeUnit.MINUTES);
//        //4.通过工具类SmsUtil调用短信接口发送短信
//        SmsUtil.sendSms(phone,"您的验证码为："+code+",请在3分钟之内使用！" );
        System.out.println("==========================================================================================================");;
//        String phone = params.get("phone");
//        String type = params.get("type");//业务类型
//        if(!StringUtils.hasLength(phone)){
//            throw new BusinessException("请输入手机号！");
//        }
//        if("register".equals(type)){
//            //1.2 手机号是否被注册==？？？？
//            User user = userMapper.loadByPhone(phone);
//            if(user!=null){
//                throw new BusinessException("请勿重复注册！");
//            }
//            String businessKey = UserConstants.USER_REGISTER_CODE_PREFIX+phone;
//            sendSmsCode(businessKey);
//        }else if("binder".equals(type)){
//            String businessKey = UserConstants.BINDER_CODE_PREFIX+phone;
//            sendSmsCode(businessKey);
//        }

        String phone = params.get("phone");
        String type = params.get("type");
        if(!StringUtils.hasLength(phone)){
            throw new BusinessException("请输入电话号码");

        }
        if("register".equals(type)){
            //手机号是否被注册
            User user = userMapper.loadByPhone(phone);
            if(user!=null){
                throw new BusinessException("手机号已注册");
            }
            String businessKey = UserConstants.USER_REGISTER_CODE_PREFIX+phone;
            sendSmsCode(businessKey);
        }else if ("binder".equals(type)){
            String businessKey = UserConstants.BINDER_CODE_PREFIX+phone;
            sendSmsCode(businessKey);
        }

    }

    private void sendSmsCode(String businessKey) {
        //2.判断验证码是否存在  （从redis中拿 key：  业务code:phone）
        Object codeObj = redisTemplate.opsForValue().get(businessKey);
        String code = null;
        //2.1 如果存在
        if(codeObj!=null){
            String codeStr = (String) codeObj;
            String tim = codeStr.split(":")[1];
            Long time = Long.valueOf(tim);
            Long interval = System.currentTimeMillis()-time;
            //2.1.1 判断是否过了重发时间（value：  VerifyCode:time）
            //2.1.1.1 如果没过  直接抛业务异常：请勿重复发送验证码
            if(interval<=60*1000){
                throw new BusinessException("请勿重复发送验证码！！");
            }
            //2.1.1.2 如果过了重发时间（还未过有效期）   使用原来还没有过期的验证码 （放到下面去刷新）
            code = codeStr.split(":")[0];
        }else {
            //2.2 不存在
            //2.2.1 生成新的验证码
            code = StrUtils.getComplexRandomString(4);
        }
        //3.存储redis，并设置过期时间
        redisTemplate.opsForValue().set(businessKey, code+":"+System.currentTimeMillis(), 3, TimeUnit.MINUTES);
        //4.调用短信接口，发送验证码
        /*SmsUtils.send(phone, "您的验证码是："+code+";请在三分钟内使用！");*/
        System.out.println("您的验证码是："+code+";请在三分钟内使用！");
    }
}
